package fr.jhaccoun.demenager_eco.produit;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotBlank;
import org.springframework.stereotype.Component;

import fr.jhaccoun.demenager_eco.utilisateur.Utilisateur;


@Component
@Entity 
@Table(name = "PRODUIT") 
public class Produit {

	//TODO Creer un constructeur avec ts les parametres obligatoires
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="produit_produit_id_seq")
    @SequenceGenerator(name="produit_produit_id_seq", sequenceName="produit_produit_id_seq", allocationSize=1)
	@Column(name = "PRODUIT_ID")
	private Long id;
	
	@Size(max = 60 )
	@NotBlank
	@Column(name = "INTITULE")
	private String intitule;
	
	@Size(max = 50 )
	@Column(name = "REFERENCE")
	private String reference;
	
	@Lob()
	@Column(name = "DESCRIPTION")
	private String description;
	
	@Column(name = "POIDS")
	private Integer poids;
	
	@Column(name = "MARQUE")
	@NotBlank
	private String marque;
 	 
	@Embedded
	private Taille taille;
 	  
	@ManyToOne
	@JoinColumn(name = "PRODUIT_CATEGORIE_ID", nullable = false)
	private Categorie categorie;
	
	@ManyToOne
	@JoinColumn(name = "UTILISATEUR_ID", nullable = false)
	private Utilisateur utilisateur;
	
	@ManyToOne
	@JoinColumn(name = "PRODUIT_ETAT_USURE_ID", nullable = false)
	private EtatUsure etatUsure;

	@NotNull
	@Column(name = "PRIX_VENTE") 
	private BigDecimal prixVente;
 	
//	private DureeAnciennete dureeAnciennete;
	
	@NotNull
	@Column(name = "FACTURE")
	private Boolean facture;
	
	@NotNull
	@Column(name = "GARANTI")
	private Boolean garanti;
//	private Duree dureeRestantGaranti;

	//private photo
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATE_MODIFICATION")
	private Date dateModification;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATE_CREATION")
	private Date dateCreation;
	
	
	//TODO Utiliser le pattern Builder pr construire l'objet plus facilement car trop de parametre constructeur dc trop compliqué de bien appeler sans se tromper

	public Produit(){
		//Obligatoire pour hibernate
	}
	
	public Produit(String intitule, String reference, String description,
			Integer poids, String marque, Taille taille, Categorie categorie,
			Utilisateur utilisateur, EtatUsure etatUsure, BigDecimal prixVente,
			Boolean facture, Boolean garanti) { 
		this.intitule = intitule;
		this.reference = reference;
		this.description = description;
		this.poids = poids;
		this.marque = marque;
		this.taille = taille;
		this.categorie = categorie;
		this.utilisateur = utilisateur;
		this.etatUsure = etatUsure;
		this.prixVente = prixVente;
		this.facture = facture;
		this.garanti = garanti;
	}

	@PrePersist
	public void beforeCreate() {
		setDateCreation(new Date());
		setDateModification(new Date());
	}
	
	@PreUpdate
	public void beforeUpdate() {
		setDateModification(new Date());
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getIntitule() {
		return intitule;
	}

	public void setIntitule(String intitule) {
		this.intitule = intitule;
	}

	public String getReference() {
		return reference;
	}

	public void setReference(String reference) {
		this.reference = reference;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Integer getPoids() {
		return poids;
	}

	public void setPoids(Integer poids) {
		this.poids = poids;
	}

	public String getMarque() {
		return marque;
	}

	public void setMarque(String marque) {
		this.marque = marque;
	}

	public Taille getTaille() {
		return taille;
	}

	public void setTaille(Taille taille) {
		this.taille = taille;
	}

	public Categorie getCategorie() {
		return categorie;
	}

	public void setCategorie(Categorie categorie) {
		this.categorie = categorie;
	}

	public EtatUsure getEtatUsure() {
		return etatUsure;
	}

	public void setEtatUsure(EtatUsure etatUsure) {
		this.etatUsure = etatUsure;
	}

	public BigDecimal getPrixVente() {
		return prixVente;
	}

	public void setPrixVente(BigDecimal prixVente) {
	    this.prixVente = prixVente.setScale(2,RoundingMode.HALF_UP);  
	}

	public Boolean getFacture() {
		return facture;
	}

	public void setFacture(Boolean facture) {
		this.facture = facture;
	}

	public Boolean getGaranti() {
		return garanti;
	}

	public void setGaranti(Boolean garanti) {
		this.garanti = garanti;
	}
	 
	public Date getDateModification() {
		return dateModification;
	}

	public void setDateModification(Date dateModification) {
		this.dateModification = dateModification;
	}

	public Date getDateCreation() {
		return dateCreation;
	}

	public void setDateCreation(Date dateCreation) {
		this.dateCreation = dateCreation;
	}
 
	public Utilisateur getUtilisateur() {
		return utilisateur;
	}

	public void setUtilisateur(Utilisateur utilisateur) {
		this.utilisateur = utilisateur;
	}
 
	
	
}
